# key:value形式的数据结构
# TODO 定义字典
# 第一种[常用]
# dict1 = {key1:value1, key2:value2, keyn:valuen}
dict1 = {'name': '付艺', 'age': 18, 'addr': '成都', 'stu_no': 19}
print(dict1)
print(type(dict1))
dict3 = {}
print(dict3, type(dict3))

# 第二种
# dict2 = dict(key1=value, kye2=value2)
dict2 = dict()
print(dict2)
print(type(dict2))

# TODO 特点
dict1 = {'name': '付艺', 'age': 18, 'addr': '成都', 'stu_no': 18, 'name': 'hello'}
print(dict1)
"""
1. 字典的key是唯一的。
2. 字典的值可以是任何数据类型
3. 字典的key必须是不可变数据类型，一般key就使用字符串
4. 字典是可变数据类型
"""

# 字典配合列表使用
class_a = [
    {'name': '付艺1', 'age': 18, 'stu_no': 18},
    {'name': '付艺2', 'age': 18, 'addr': '成都', 'stu_no': 18},
    {'name': '付艺3', 'age': 18, 'addr': '成都', 'stu_no': 18}
]

# TODO 修改
# 语法：dict[key] = value
dict1 = {'name': 'hello', 'age': 18}
dict1['name'] = 'good'
print(dict1)
dict1['age'] = 20
print(dict1)

# TODO 新增
# key存在就是修改，不存在就是新增
# 语法：dict[key] = value
dict1['addr'] = '重庆'
print(dict1)

# TODO 根据key获取值
# 第一种：中括号
# 语法：dict[key]
# 说明：如果key不存在，会抛出错误
dict1 = {'name': 'hello', 'age': 18}
print(dict1['name'])
# print(dict1['addr'])
print('==' * 20)

# 第二种：方法
# 语法：dict.get(key[, None])
# 说明：如果key不存在，返回第二个参数的值，第二个参数默认是None
dict1 = {'name': 'hello', 'age': 18}
print(dict1.get('name'))
print(dict1.get('age'))
print(dict1.get('addr'))
print(dict1.get('addr', '成都'))
print('==' * 20)

# TODO 获取字典中的所有key
# 语法：dict.keys()
dict1 = {'name': 'hello', 'age': 18}
print(dict1.keys())

# TODO 获取字典中的所有value
# 语法：dict.values()
print(dict1.values())

# TODO 获取字典中的所有key和value
# 语法：dict.items()
print('11' * 20)
print(dict1.items())    # [(key, value), (key, value)]

# len() # 通用：获取容器长度
print(len(dict1))
print('==' * 20)

# TODO in 通用：判断元素是否在容器中
# 语法： item in 容器
# dict
dict1 = {'name': 'hello', 'age': 18}
# 判断'name'是否在字典的key列表中
print('name' in dict1.keys())
print('name' in dict1)

# 判断hello是否在字典的value列表中
print('hello' in dict1.values())
print('==' * 20)

# str
print('a' in 'abc')
# list
print('a' in ['a', '1'])
# tuple
print('hello' in (1, 2, 3))

# TODO del dict[key] 通用语法
dict1 = {'name': 'hello', 'age': 18}
del dict1['name']
print(dict1)
print('==' * 20)

# TODO dict.pop(key, param)  弹出（删除并返回）key对应的数据
# 说明：如果传入的key不存在，那么返回第二个参数param.不指定第二个参数就报错。
dict1 = {'name': 'hello', 'age': 18}
print(dict1.pop('name', 'good'))
print(dict1)

print(dict1.pop('addr', 'xx'))
print('==' * 20)

# TODO dict.clear() 清空字典
dict1 = {'name': 'hello', 'age': 18}
dict1.clear()
print(dict1)

print('==' * 20)
class_a = [
    {'name': '付艺1', 'age': 18, 'addr': '成都', 'stu_no': 18},
    {'name': '付艺2', 'age': 18, 'addr': '成都', 'stu_no': 18},
    {'name': '付艺3', 'age': 18, 'stu_no': 18}
]

for stu_info in class_a:
    print(stu_info.pop('addr', '成都'))
    print(stu_info)

# TODO 遍历key
dict1 = {'name': 'good', 'age': 19}
# print(dict1.keys())
# 第一种
for key in dict1.keys():
    print(key)
print('--' * 20)
# 第二种
for key in dict1:
    print(key)
print('==' * 20)

# TODO 遍历value
for value in dict1.values():
    print(value)
print('==' * 20)

# TODO 遍历key和value
# dict1.items()  # [(key, value), (key, value), ...]
# key, value = ('name', 'good')
for key, value in dict1.items():  # [('name', 'good'), ('age', 19)]
    print(key, value)
